- Notifications
You must be signed in to change notification settings - Fork 56
/
Copy path1225. Report Contiguous Dates.sql
51 lines (49 loc) · 1.36 KB
/
1225. Report Contiguous Dates.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
WITH cte1 AS(
SELECT fail_date AS dt,'failed'AS status
FROM failed_1225
WHERE EXTRACT(YEAR from fail_date) =2019
UNION
SELECT success_date AS dt,'succeeded'AS status
FROM succeeded_1225
WHERE EXTRACT(YEAR from success_date) =2019
),
cte2 AS (
SELECT*,
LAG(status) OVER (ORDER BY dt) AS lagged_status
FROM cte1
),
cte3 AS (
SELECT*,
(CASE WHEN status = lagged_status THEN 0 ELSE 1 END) AS marker
FROM cte2
),
cte4 AS (
SELECT*,
SUM(marker) OVER (ORDER BY dt) AS rolling_sum
FROM cte3
)
SELECTMAX(status) AS period_state, MIN(dt) AS start_date, MAX(dt) AS end_date
FROM cte4
GROUP BY rolling_sum;
---------------------------------------------------------------------------------------------------------------------------------------------
--Simplified Query
---------------------------------------------------------------------------------------------------------------------------------------------
WITH tasks AS (
SELECT fail_date AS dt,'failed'AS status
FROM failed_1225
UNION
SELECT success_date AS dt,'succeeded'AS status
FROM succeeded_1225
),
ranked AS (
SELECT*,
ROW_NUMBER() OVER (ORDER BY dt)-ROW_NUMBER() OVER (PARTITION BY status ORDER BY dt) AS diff
FROM tasks
WHERE dt BETWEEN '01-01-2019'AND'31-12-2019'
ORDER BY dt
)
SELECT status,
MIN(dt) AS start_date,MAX(dt) AS end_date
FROM ranked
GROUP BY status,diff
ORDER BY start_date;